package com.gym.myshop.dao.impl;

import com.gym.myshop.dao.ItemDao;
import com.gym.myshop.entity.Item;
import com.gym.myshop.entity.Product;
import com.gym.myshop.util.DBUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author ming
 * 2021/11/8
 * description:订单信息
 */
public class ItemDaoImpl implements ItemDao {
    private QueryRunner qr = new QueryRunner();

    /**
     *@author:ming
     *@Date: 2021/11/8
     *@description:新增订单信息
     *iid订单项的唯一标识 oid订单编号是字符串类型但是也是唯一标识
     * pid商品的唯一主键 Icount订单项的小计  Inum订单项的商品数量
     */
    @Override
    public void addItems(List<Item> items) throws SQLException {
        //二维数组Object[需要批量处理的sql条数][需要处理的sql的实际参数列表]
        //items.size()元素个数做外层的高维数组
        Object[][] args=new Object[items.size()][];
        String sql = "insert into item values (default,?,?,?,?)";
        //遍历 集合,把集合数据转到此 二维数组中实际保存参数的数组
        for (int i = 0; i < items.size(); i++) {
            //边声明边赋值数组, 给二维数据，
            Item item=items.get(i);
            //数据的参数放进低维数组中
            args[i]=new Object[]{item.getOid(), item.getPid(), item.getIcount(), item.getInum()};
        }
        //调用批量处理的方法，处理购物车商品订单
        int[] batch = qr.batch(DBUtil.getConnection(), sql, args);
    }

    /**
     *@author:ming
     *@Date: 2021/11/8
     *@description:获取订单信息  oid订单编号是字符串类型但是也是唯一标识
     */
    @Override
    public List<Item> getItemListByOid(String oid) throws SQLException, InvocationTargetException, IllegalAccessException {
        String sql ="select * from item i inner join product p on i.pid=p.pid where i.oid=?";

        List<Map<String, Object>> query = qr.query(DBUtil.getConnection(), sql, new MapListHandler(), oid);
        if (query != null) {
            List<Item> itemList = new ArrayList<>();
            for (Map<String, Object> stringObjectMap : query) {
                Item it = new Item();
                Product p = new Product();
                //订单信息
                BeanUtils.populate(it, stringObjectMap);
                //下单的商品信息
                BeanUtils.populate(p, stringObjectMap);
                //获取下单商品信息进行封装
                it.setPro(p);
                //订单中添加进商品信息查看
                itemList.add(it);
            }
            return itemList;
        }
        return null;
    }
}
